home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 3
/
Amiga Format CD03 (1996-07-04)(Future Publishing)(GB)(Track 1 of 6)[!][issue 1996-08].iso
/
comms
/
netsoftware
/
nethandler.lha
/
NetHandler
/
handler
/
device.c
next >
Wrap
C/C++ Source or Header
|
1989-09-16
|
5KB
|
176 lines
/* Device.c - Device support routines */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery. All Rights */
/* |. o.| || Reserved. This program may not be distributed without the */
/* | . | || permission of the authors: BBS: */
/* | o | || John Toebes Doug Walker Dave Baker */
/* | . |// */
/* ====== */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "handler.h"
#define MYNAME "\7NETWORK"
typedef struct FileSysStartupMsg *FSSM;
int GetDevice (global, myfssmsg)
GLOBAL global;
FSSM myfssmsg;
{
FSSM fssmsg;
int devnum;
char *defaultdev = "serial.device";
BUGP("GetDevice entry")
BUG(("devname:%s\n",global->n.devname));
BUG(("Global->node = %08lx Global->node->dn_Startup = %08lx\n",
global->node, BADDR(global->node->dn_Startup)));
/* Did they give us any information in the device list ? */
if( (fssmsg = (FSSM)BADDR(global->node->dn_Startup)) == NULL)
{
BUGP("Null FSSM")
/* Initialize the device information */
global->unitnum = myfssmsg->fssm_Unit = devnum = 0;
myfssmsg->fssm_Device = (ULONG)defaultdev;
myfssmsg->fssm_Flags = 0;
BUG(("GetDevice-fssm_Device:%s\n", myfssmsg->fssm_Device));
BUG(("GetDevice-fssm_Unit:%ld\n", myfssmsg->fssm_Unit));
BUG(("GetDevice-fssm_Flags:%lx\n", myfssmsg->fssm_Flags));
}
else
{
BUGP("Good FSSM")
/* They gave us all the device information in the mountlist */
if(fssmsg->fssm_Device != NULL)
myfssmsg->fssm_Device = (ULONG)BADDR(fssmsg->fssm_Device);
else
myfssmsg->fssm_Device = (ULONG)defaultdev;
global->unitnum =
myfssmsg->fssm_Unit = fssmsg->fssm_Unit;
myfssmsg->fssm_Flags = (ULONG)BADDR(fssmsg->fssm_Flags);
BUG(("fssm:%lx\n", fssmsg));
BUG(("fssm_Device:%s\n", fssmsg->fssm_Device));
BUG(("fssm_Unit:%ld\n", fssmsg->fssm_Unit));
BUG(("fssm_Flags:%lx\n", fssmsg->fssm_Flags));
}
BUGP("GetDevice exit")
return(-1);
}
int InitDevice(global)
GLOBAL global;
{
struct FileSysStartupMsg myfssmsg;
int rc;
BUGP("InitDevice: Enter")
BUG(("InitDevice: Enter\n"));
if (GetDevice(global,&myfssmsg) == NULL)
{
BUG(("GetDevice Failed \n"));
return(0);
}
if(!(global->n.devport=CreatePort(NULL,0)))
{
BUG(("ERROR: Can't CreatePort\n"));
return(0);
}
BUG(("fssm_Device:%s\n", myfssmsg.fssm_Device));
BUG(("fssm_Unit:%ld\n", myfssmsg.fssm_Unit));
BUG(("fssm_Flags:%lx\n", myfssmsg.fssm_Flags));
BUGP("Init NetNode")
/* Initialize NetNode struct for ourselves - at root of netnodes */
global->netchain.next = NULL;
global->netchain.status = NODE_UP;
MBSTR(MYNAME, global->netchain.name);
global->netchain.id = 0;
global->netchain.ioptr = NULL;
global->netchain.RootLock.NetNode = &global->netchain;
/* A NULL RDevice indicates this is a lock on the local root */
global->netchain.RootLock.RDevice = NULL;
global->netchain.RootLock.RPtr = NULL;
global->numnodes = global->upnodes = 1;
#ifndef SMALLPACKET
MBSTR(MYNAME, global->RP.handler);
global->RP.handlerid = 0; /* Fix this! */
#endif
rc = InitRDevice(global);
BUGP("InitDevice: Exit")
return(rc);
}
struct NetNode *AddNode(global, name, ioptr)
GLOBAL global;
char *name;
APTR ioptr;
{
struct NetNode *node;
BUGBSTR("AddNode: Adding ", name);
BUG(("ioptr is %lx\n", ioptr));
/* First see if the node's name is unique */
for(node=&global->netchain; node; node=node->next)
{
if(!stricmp(node->name, name))
{
if(node->status == NODE_UP) global->upnodes--;
break;
}
}
if(!node)
{
BUG(("AddNode: Node not in chain\n"));
/* Node is new, add it */
if(!(node=(struct NetNode *)DosAllocMem(global,
(long)sizeof(struct NetNode))))
{
BUG(("AddNode: Out of memory!\n"));
return(NULL);
}
/* Chain the node into the list of network nodes */
node->next = global->netchain.next;
global->netchain.next = node;
strcpy(node->name, name);
node->devname[0] = '\0';
node->id = 0;
global->numnodes++;
/* Set up dummy lock for lock templating */
node->RootLock.NetNode = node;
node->RootLock.RDevice = (RPTR)1L; /* For now - Obtain from remote */
node->RootLock.RPtr = NULL; /* For always */
}
node->status = (ioptr ? NODE_UP
: (node->status == NODE_UP ? NODE_CRASHED
: NODE_DEAD));
node->ioptr = ioptr;
if(node->status == NODE_UP) global->upnodes++;
return(node);
}
int TermDevice(global)
GLOBAL global;
{
TermRDevice(global, 0);
return(1);
}